//基础类型
(() => {
    //布尔类型  --->boolean
    let flag: boolean = true
    console.log(flag)

    //数字类型   --->number
    let a1: number = 10 // 十进制
    let a2: number = 0b1010  // 二进制
    let a3: number = 0o12 // 八进制
    let a4: number = 0xa // 十六进制
    console.log(a1)
    console.log(a2)
    console.log(a3)
    console.log(a4)


    //字符串类型  --->string
    let str1: string = '窗前明月光'
    let str2: string = '疑似地上霜'
    console.log(`${str1},${str2}`)

    //字符串和数字的拼接
    let str5: string = '数字'
    let a5: number = 999
    console.log(str5 + a5)

    let und: undefined = undefined
    let nul: null = null
    console.log(und)
    console.log(nul)
    //undefined和null可以作为其他类型的子类型
    let num2: number = undefined
    console.log(num2)

    //数组类型
    //定义方式1 
    let arr1: number[] = [10, 20, 30]
    console.log(arr1)
    //定义方式2:泛型的写法
    let arr2: Array<number> = [100, 200, 300]
    console.log(arr2)


    //元组类型
    //类型的位置和数据的个数一致
    let arr3: [string, number, boolean] = ['ssss', 20, false]
    console.log(arr3)
    console.log(arr3[0].split(''))
    console.log(arr3[1].toFixed(4))

    //枚举类型,里面的每个数据可以叫做元素，有自己的编号，默认从 0 开始为元素编号，你也可以手动的指定成员的数值,数值可以是字符（不推荐）
    enum Color {
        red = 1,
        green,
        blue
    }
    let color: Color = Color.red
    console.log(color)
    console.log(Color.red, Color.green, Color.blue)
    console.log(Color[3])

    // enum Gender{
    //     女,
    //     男,
    // }
    // console.log(Gender[0])

    //any类型
    let str: any = 100
    str = '年少不知富婆好'
    console.log(str)
    str = 1
    console.log(str)
    //当数组要存储多个数据，个数不确定，类型不确定
    let arr: any[] = [100, '窗前明月光', false]
    console.log(arr)

    //void类型,void 类型像是与 any 类型相反，它表示没有任何类型, 
    //代表函数没有返回值
    function shoeMsg(): void {
        console.log('qqqqq')
        // return 1
    }
    console.log(shoeMsg())

    //object类型
    function getobj(obj: object): object {
        console.log(obj)
        return {
            name: '年少不知富婆好',
            age: 12
        }

    }
    console.log(getobj({ name: '卡卡西', age: 14 }))
    // console.log(getobj(new String('哈撒剋')))
    // console.log(getobj(String))

    //联合类型
    //需求1: 定义一个一个函数得到一个数字或字符串值的字符串形式值
    // function toString2(x: number | string) : string {
    //     return x.toString()
    // }
    // console.log(toString2('123'))
    //需求2: 定义一个一个函数得到一个数字或字符串值的长度
    function toString2(x: number | string) : number {
        return x.toString().length
    }
    console.log(toString2('abcdef'))


    //类型断言
    //方式一: <类型>值
    //方式二: 值 as 类型  tsx中只能用这种方式

    function toString3(x: number | string) : number {
        return x.toString().length
        if((<string>x).length){
            return (x as string).length
        }else{
            return x.toString().length
        }
    }
    console.log(toString3(123))
    console.log(toString3('abcdef'))

    //类型推断: TS会在没有明确的指定类型的时候推测出一个类型
    //1. 定义变量时赋值了, 推断为对应的类型. 2. 定义变量时没有赋值, 推断为any类型
    let b9 = 123 // number
    // b9 = 'abc' // error
    let txt;
    txt = 123
    txt = 'abc'
    console.log(txt)






}
)()